#ifndef ODBCUTIL_H
#define ODBCUTIL_H
#include "sqltype.h"
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
#include <QVariant>
#include <QString>
#include <QList>
#include <QDebug>

class OdbcUtil
{
public:
    OdbcUtil();
    ~OdbcUtil();

    //执行
    bool executeQuery(const QString &query);
    //执行获取一行的数据
    bool executeQuery(const QString &query,QVariantMap &results);
    //执行获取多行的数据
    bool executeQuery(const QString &query,QList<QVariantMap> &results);
    //执行并绑定数据
    bool executeQueryBind(const QString &query,const QVariantMap &results);

    //查询多行所有列信息
    QList<QVariantMap> selectAll(const QString &tableName);
    //条件查询多行所有列信息
    QList<QVariantMap> selectAll(const QString &tableName,const QString &whereClause);
    //条件查询多行选定列的信息
    QList<QVariantMap> selectAll(const QStringList &fieldNames,const QString &tableName,const QString &whereClause);
    //两表联合查询多行选定列的信息
    QList<QVariantMap> selectAll(const QStringList &fieldNames,const QString &table1,const QString &alias1,const QString &table2,const QString &alias2,const QString &conditionField,const QString &whereClause);
    //三表联合查询多行选定列的信息
    QList<QVariantMap> selectAll(const QStringList &fieldNames,const QString &table1,const QString &alias1,const QString &table2,const QString &alias2,const QString &conditionField1,const QString &table3,const QString &alias3,const QString &conditionField2,const QString &whereClause);

    //检查是否有满足条件的行
    bool selectOne(const QString &tableName,const QString &whereClause);

    //条件查询一行选定列的信息
    QVariantMap selectOne(const QStringList &fieldNames,const QString &tableName,const QString &whereClause);
    //map存储返回结果
    bool selectOne(QVariantMap &map,const QString &tableName,const QString &whereClause);

    //两表联合查询一行选定列的信息
    QVariantMap selectOne(const QStringList &fieldNames,const QString &table1,const QString &alias1,const QString &table2,const QString &alias2,const QString &conditionField,const QString &whereClause);

    //插入一行的信息
    bool insertRecord(const QString &tableName, const QVariantMap &record);

    //条件更新多行一列的信息
    bool updateOne(const QString &tableName, const QString &fieldName,const QString &value, const QString &whereClause);

    bool updateRecord(const QString &tableName, const QVariantMap &record, const QString &whereClause);
    bool updateRecordBind(const QString &tableName, const QVariantMap &record, const QString &whereClause);

    //条件删除多行的信息
    bool deleteRecord(const QString &tableName, const QString &whereClause);
protected:
    void initConnectionType(SqlType type);
    void setDataBaseName(const QString &dataBaseName);
    void setHostName(const QString &hostName);
    void setPassword(const QString &password);
    void setUserName(const QString &userName);
    void setPort(const int &port);
    void setConnectOptions(const QString &option);
    void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precision);

    bool openDatabase();
    bool closeDatabase();
private:
    QSqlDatabase db;
    bool isEmpty(const std::initializer_list<QString> &strings);
};

#endif // ODBCUTIL_H
